package org.cwx.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.log4j.Logger;

public class MyUtils {
	public static Logger logRootLogger = Logger.getLogger("rootLogger");

	/**
	 * 简单工厂模式：获取一个指定Class的实例对象
	 * 
	 * @param clazz Class
	 * @return 实例对象
	 */
	public static <T> T getInstance(Class<T> clazz) {
		// 返回值
		T t = null;
		try {
			// 反射获取该Class的一个实例对象
			t = clazz.newInstance();
		} catch (Exception e) {
			// 获取实例对象异常
			// e.printStackTrace();
			System.out.println("获取实例对象异常:" + e.getMessage());
		}
		return t;
	}

	/**
	 * 使用反射，将request中提交的form表单数据映射到实体类中 约定：表达的name属性值和数据库的字段名保持一致【大小写敏感】
	 * 
	 * @param request request请求对象
	 * @param clazz   实体类的Class
	 * @return 映射表达数据的实体类实例
	 */
	public static <T> T convertFormData2Bean(HttpServletRequest request, Class<T> clazz) {
		T t = getInstance(clazz);
		if (request != null) {

			/*******
			 * 注册定义了类型转换器：form表单中的String串向目标数据类型的自定义转换 定义BeanUtils的包装类类型的转换器【可以使用匿名内部类】
			 ********/
//			ConvertUtils.register(new DateTimeConverter(), Date.class);

			try {
				// request.getParameterNames()方法是将发送请求页面中form表单里所有具有name属性的表单对象获取(包括button).返回一个Enumeration类型的枚举.
				Enumeration<String> paramName = request.getParameterNames();

				if (paramName != null) {

					System.out.println("***********************" + paramName.toString());
					// hasMoreElements() 当且仅当此枚举对象至少还包含一个可提供的元素时，才返回 true
					while (paramName.hasMoreElements()) {

						System.out.println("***********************");

						// 如果此枚举对象至少还有一个可提供的元素，则返回此枚举的下一个元素。此枚举的下一个元素。
						String strName = (String) paramName.nextElement();
						// 读取提交的表单中的值
						String strVal = request.getParameter(strName);
						// 将获取到的数据打包放入实体类中(把对象的属性数据封装到对象中)
						// bean是指你将要设置的对象，name指的是将要设置的属性(写成"属性名"),value(从配置文件中读取到到的字符串值)
						// BeanUtils.setProperty(t, strName, strVal);
						// setProperty和copyProperty用法一样

						System.out.println("strName : " + strName);
						System.out.println("strName : " + strVal);
						BeanUtils.copyProperty(t, strName, strVal);
					}
				}
			} catch (Exception e) {
				// e.printStackTrace();
//				logRootLogger.info("form表单属性值映射到实体类中异常：" + e.getMessage());
				System.out.println("form表单属性值映射到实体类中异常：" + e.getMessage());
			}
		}

///////////////////// 文件的映射处理-end////////////////////////////

		System.out.println(t);
		return t;
	}

	/**
	 * 将时间类型专为制定格式的字符串【转换失败返回null】
	 * 
	 * @param date           被转化的时间对象
	 * @param strDatePattern 转换的时间格式串
	 * @return 转换之后的日期字符串
	 */
	public static String convertDate2String(Date date, String strDatePattern) {
		// 返回值
		String strDate = null;

		// 日期格式串检测
		if (strDatePattern == null || strDatePattern.equals("")) {
			// 给定默认的时间格式串
			strDatePattern = "yyyy-MM-dd HH:mm:ss";
		}

		// 创建日期转换类
		SimpleDateFormat sdf = new SimpleDateFormat(strDatePattern);

		if (date != null) {
			// 将日期类型专为指定格式的字符串
			strDate = sdf.format(date);
		} else {
			// 根据需求确定
			// strDate = sdf.format(new Date());
		}
		// 返回值
		return strDate;
	}

	/**
	 * 将字符串转换为日期对象 【注意：日期格式串和日期字符串要在格式上匹配】
	 * 
	 * @param strDate        日期字符串
	 * @param strDatePattern 日期格式串
	 * @return 转换之后的日期对象【默认为当前系统时间】
	 */
	public static Date convertString2Date(String strDate, String strDatePattern) {
		// 返回值，默认为当前时间【还是为null，根据业务需求定】
		Date date = new Date();
		// 日期格式串检测:注意：日期格式串和日期字符串要在格式上匹配
		if (strDatePattern == null || strDatePattern.equals("")) {
			// 给定默认的时间格式串
			strDatePattern = "yyyy-MM-dd HH:mm:ss";
		}

		// 创建日期转换类
		SimpleDateFormat sdf = new SimpleDateFormat(strDatePattern);

		try {
			// 进行日期转换
			date = sdf.parse(strDate);
		} catch (Exception e) {
			// 日期转换异常
//			e.printStackTrace();
			System.out.println("字符串转为日期对象异常：" + e.getMessage());
		}
		// 返回值
		return date;
	}

	public static void main(String[] args) {
		int i = 1;
		if (i == 1) {
//			#OFF FATAL ERROR WARN INFO DEBUG ALL  (heig-->low)
			logRootLogger.fatal("fatal");
			logRootLogger.error("error");
			logRootLogger.warn("warn");
			logRootLogger.info("info");
			logRootLogger.debug("debug");
		}
	}

}
